package main

import (
	"fmt"
	"reflect"
)

type Student struct {
	Id   int `info:"id" doc:"序号"`
	Name string
}

func (s Student) Hello() string {
	fmt.Println("我是一个学生")
	return ""
}

func main() {
	s := Student{Id: 1, Name: "咖啡色的羊驼"}
	//获取目标对象类型
	t := reflect.TypeOf(s)
	fmt.Println("这个类型的名称是：", t)

	//获取目标对象的值类型
	v := reflect.ValueOf(s)
	//。NumField()来获取其包含的字段的总数
	for i := 0; i < t.NumField(); i++ {
		//遍历Student包含的key
		key := t.Field(i)
		value := v.Field(i).Interface()
		fmt.Printf("第%d个字段是：%s:%v = %v \n", i+1, key.Name, key.Type, value)
		if key.Name == "Id" {
			fmt.Printf("获取tag[info]：%s,tag[doc]:%s", key.Tag.Get("info"), key.Tag.Get("doc"))
		}
	}
	//通过.NumMethod()获取student里的方法
	for i := 0; i < t.NumMethod(); i++ {
		method := t.Method(i)
		fmt.Printf("第%d个方法是%s:%v\n", i+1, method.Name, method.Type)
	}

}
